#include "../header.h"

//.1守护进程: 后台运行 脱离终端  完成一定的任务
//2.守护进程编程方法：
//? 1 父进程创建子进程 父进程退出
//? 2 子进程建立新的回话组
//? 3 权限掩码修改， 0002 -> 0066 -> 屏蔽同组用户 + 陌生人的阅读修改的权限
//? 4 工作目录修改。. 
//? 5 系统中每个默认运行的应用程序，操作系统都会 默认打三个文件 标准输入文件 标准输出文件 标准错误文件
//? 6 每秒钟记录一个时间到文件中，info.time;
//? 7 日志记录方法
int main(int argc, char const *argv[])
{
    
    //! 1 父进程创建子进程 父进程退出
    pid_t pid = fork();
    if(pid < 0)
        exit(-1);
    if(pid > 0)
        exit(0);
    //子进程空间
    if(pid == 0)
    {
        //! 2 子进程建立新的回话组
        pid_t sid = setsid();
        printf("新会话组的组长进程是sid = %d 子进程的pid = %d\n",sid,getpid());

        //! 3 权限掩码修改， 002 -> 0066 -> 屏蔽同组用户 + 陌生人的阅读修改的权限
        if( umask(0066) < 0 )
        {
            perror("umask set error\n");
            return -1;
        }
        printf("修改权限掩码成功!\n");

         //删除目录文件
        rmdir("./one");
        if(mkdir("one",0775) < 0 )
        {
            perror("创建新工作目录失败\n");
            return -1;
        }
       
        //! 4 工作目录修改。. 
        if(chdir("./one") < 0 )
        {
            perror("修改工作目录失败\n");
            return -1;
        }
        printf("修改工作目录成功!\n");

        //! 5 系统中每个默认运行的应用程序，操作系统都会 默认打三个文件 标准输入文件 标准输出文件 标准错误文件。
        // 0 1 2  
        // 现在让这三个文件描述符对应到一个  空文件中。
        int fd = open("/dev/null",O_WRONLY);
        if(fd < 0 )
        {
            perror("open /dev/nullerror! \n");
            return -1;
        }
        //也叫做重定向
        //fd 0 1 2 ->>> /dev/null
        dup2(fd,STDIN_FILENO);
        dup2(fd,STDOUT_FILENO);
        dup2(fd,STDERR_FILENO);

        close(fd);
        // 每秒钟记录一个时间到文件中，info.time;
        time_t tm = 0;
        //创建一个文件。
        int fdm = open("info.time",O_CREAT | O_RDWR | O_TRUNC,0666);
        char * stime = NULL;

        printf("测试开始!\n");

        while(1)
        {
            tm = time(NULL);
            stime = asctime(localtime(&tm));
            write(fdm,stime,strlen(stime));
            //在日志文件中，记录当前登录时间。
            // /var/log/syslog
            syslog(LOG_INFO,"%d 在 %s 时刻，读写日志文件\n",getpid(),stime);
            sleep(1);
        }
        close(fdm);
    }
    return 0;
}
